[ 前端工具 ] - SCSS


Posted by krebikshaw on 2020-08-26

筆記

變數

  • 用符號 $ 開頭,後面加上 :
$primary: #eee;

巢狀

  • 可以用 & 來表示父層選擇器
.header {
  color: $primary;
  &_h1 {
    font-size: $normal;
  }
}

檔案引入

  • 假設我們把變數都放在一個相同的檔案底下 _variables.sass(底線是要引入的命名慣例)
  • 可以利用 @import 來引入
@import _variable  // 副檔名要加不加都可以

規則引入(無參數版)

  • 假設我們把常用樣式變成一個規則
    • 規則用符號 % 開頭
  • 可以利用 @extend 引入
%btn {
  font-size: 14px;
  color: #fff;
}

.btn {
  @extend %btn;    // 套入 %btn 的規則
}

規則引入(參數版)

  • 假設我們訂定一個可以帶入參數的規則
    • 這個規則要以 @mixin 開頭
  • 可以用符號 + 引入
@mixin hover($color) {
  &:hover{
    background: $color;
  }
}

.btn {
  +hover($primary);
}

函式

  • 寫「計算」的時候或者需要「return」東西的時候使用
  • 假設我們想要寫一個 letter-spacing 跟字體大小的算式我們可以這樣寫
  • 可以直接呼叫函式名稱來引入
@function letter-spacing($font-index) {
  @return $font-index / 10 * 0.2rem
}

@mixin hover($color) {
  &:hover{
    letter-spacing: letter-spacing(5rem);
  }
}

陣列 & 物件

  • 陣列寫法
    • 變數形式開頭,元素間用 , 隔開
$array: center, start, end;
  • 物件寫法
    • 變數形式開頭,用 () 包住,用 : 區分 key 跟 value,中間用 , 隔開
$object: (center:center, start:flex-start, end:flex-end);

迴圈

  • 如果在 selector 要套入變數要加上 #{ }

  • each 迴圈

    • 用 $type, $value 兩個變數來取得 object 的值
$object: (center:center, start:flex-start, end:flex-end);

@each $type, $value in $object {
  .flex-#{$type} {
    display: flex;
    justify-content: $value;
  }
}
  • for 迴圈 (用來事先設定 h1~h6 很好用)
@for $i from 0 through 5 {
  .h#{5 - $i + 1} {
    font-size: 1 + 0.2rem * $i;
  }
}

判斷

  • sass 的判斷只可以用兩個 =
@for $i from 0 through 5 {
  .h#{5 - $i + 1} {
    @if $i / 2 == 0 {
      font-size: 1 + 0.2rem * $i;
    } @else {
      font-size: 1 + 0.3rem * $i;
    }
  }
}

分配

_variable.scss

  • 顏色、字體等等

_component.scss

  • 按鈕、標題、頭貼、背景 (小範圍的元件)

_mixin.scss

  • 樣式規則

_layout.scss

  • navbar、footer (大範圍的元件)

pages.scss

  • 把上面的檔案都 import 進來

CSS 預處理器

前端的程式是在瀏覽器上面跑的,不同瀏覽器的差異,會導致對程式指令的支援程度不同。如果寫了個非常新潮的語法,但是只能支援 Chrome 一種瀏覽器,這樣也不行。
「不能用的東西,自己轉換就能用了」在前端這個領域很常要處理這個問題,所以我們心裡要清楚,只要先設定好,在只能支援舊語法的瀏覽器上面,把程式碼轉成舊式的寫法就對了。
SCSS 這套工具的重點,就是讓你像寫程式一樣的方式來設定 CSS,再利用 CSS 預處理器的系統,幫你把你寫的程式編譯成瀏覽器能夠跑的 .css 資料

安裝方式

  • npm install -g sass:這個指令可以將 sass 安裝下來
  • sass input.scss output.css:可以將左邊的 scss 檔程式碼編譯成右邊的 css 檔,只要 scss 有改動過,都要執行一次指令,使 css 更新(input.scss, output.css 檔名可自訂)
  • sass --watch input.scss output.css:多了這個 --watch 可以監聽你改動的動作,只要下一次這個指令,之後 scss 被改動過,都會自動幫你做編譯,可以不用不斷自己手動執行編譯指令

基本語法

  • 先看看 CSS 的寫法,針對 nav 底下的 ul, li, a 分別做設定
nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
}
nav li {
  display: inline-block;
}
nav a {
  display: block;
  padding: 6px 12px;
  text-decoration: none;
}

// 在 scss 當中可以適用巢狀的寫法
nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}
  • 可以利用變數,將常用的顏色先設定好,等到需要用的時候再把變數帶上去
$primary-color: #333;

body {
  color: $primary-color;
}
  • & 這個符號,可以「代表自己」,下面示範 hover 的寫法
//CSS 的寫法

div {
  color: red;
}

div:hover {
  color: blue;
}

// SCSS 的寫法

div {
  color: red;

  &:hovor {
    color: blue;
  }
}
  • 可以利用 function 的方式,將常用的設定給命名,在需要的地方引入
// 將常用的方式命名
@mixin full() {
  height: 100%;
  width: 100%;
}

// 在需要的地方引入
.box {
  @include full();
  color: red;
}
  • @mixin 代表宣吿一個 function
  • @include 代表引入 function
  • 在引入的時候是可以傳參數進去的,所以 function 也可以按照帶入的參數做處理

幾個小技巧

  • 命名方式可以依據:
    • 設計師給的編號:ex. $grey-01
    • 它的使用時機:ex. $error-01 , $font-size-title, $font-size-normal
  • 可以多使用 & 來寫,相似的東西更方便管理: (& 的使用一定是在某個大括弧底下)
// CSS 的寫法
navbar {
  display: flex;
  justify-content: spacebetween;
  align-items: center;
}

navbar__left {
  margin-left: 10px;
}

navbar__left input[type="text"] {
  font-size: 30px;
}

navbar__middle {
  padding: 1em;
}

navbar__right {
  margin-right: 10px;
}

// SCSS 的寫法
$font-size-input: 30px;

navbar {
  display: flex;
  justify-content: spacebetween;
  align-items: center;

  &__left {
    margin-left: 10px;

    & input[type="text"] {   // 這邊的 & 指的是 navbar__left
      font-size: $font-size-input;
    }
  }

  &__middle {
    padding: 1em;
  }

  &__right {
    margin-right: 10px;
  }
}

#SCSS







Related Posts

我知道你懂 hoisting,可是你了解到多深?

我知道你懂 hoisting,可是你了解到多深?

LeetCode JS Easy 2704. To Be Or Not To Be

LeetCode JS Easy 2704. To Be Or Not To Be

從模組化來看 npm

從模組化來看 npm


Comments